﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data;

namespace DAO_SQLServer
{
    public static class SQL_Manager
    {
        public  static string stringConection{get;set;}
        private static SqlConnection sqlConnection { get; set; }

        /// <summary>
        /// Méotodo que permite la conexión a la base de datos.
        /// </summary>
        /// <returns>Devuelve true si la conexión fue exitosa.</returns>
        public static bool AbrirConexion()
        {
            try
            {

                sqlConnection = new SqlConnection(stringConection);

                sqlConnection.Open();
                return true;

            }
            catch (SqlException sqlExc)
            {

                return false;
            }
        }

        /// <summary>
        /// Método que permite cerrar la conexión con la Base de Datos
        /// </summary>
        /// <returns>Devuelve true si logró cerrar la conexión exitosamente.</returns>
        public static bool CerrarConexion()
        {
            try
            {
                if (sqlConnection.State == ConnectionState.Open)
                {
                    sqlConnection.Close();
                    sqlConnection.Dispose();
                    return true;
                }
                return false;
            }
            catch (SqlException sqlExc)
            {
                return false;
            }
        }

        /// <summary>
        /// Método que permite la ejecución de un comando hacia la Base de Datos
        /// </summary>
        /// <param name="nombreComando">Nombre del Store Procedure a Utilizar</param>
        /// <param name="parametros">Lista con el nombre </param>
        /// <param name="abrirConexion">Identificador que determina si se debe o no abrir la conexión con la Base de Datos.</param>
        /// <returns>Devuuelve un número tipo int indicando si la ejecución fue exitosa.</returns>
        public static int EjecutarComando(string nombreComando, List<SqlParameter> parametros, bool abrirConexion = true )
        {
            if (abrirConexion)
                if (!(AbrirConexion()))
                {
                    return -1;
                }
            int result = -1;
            try
            {
                SqlCommand command = new SqlCommand(nombreComando, sqlConnection);
                command.CommandType = CommandType.StoredProcedure;
                foreach (SqlParameter parameter in parametros)
                    command.Parameters.Add(parameter);

                result = command.ExecuteNonQuery();
            }
            catch { return -1; }

                if (abrirConexion)
                    if (!(CerrarConexion()))
                        return -1;

            return result;

        }

        /// <summary>
        /// Método que permite la ejecución de un comando hacia la Base de Datos
        /// </summary>
        /// <param name="nombreComando">Nombre del Store Procedure a Utilizar</param>
        /// <param name="parametros">Lista con el nombre </param>
        /// <param name="abrirConexion">Identificador que determina si se debe o no abrir la conexión con la Base de Datos.</param>
        /// <returns>Retorna un objeto tipo SqlDataReader con el resultado obtenido.</returns>
        public static SqlDataReader EjecutarConsulta(string nombreComando, List<SqlParameter> parametros, bool abrirConexion = true)
        {
            if (abrirConexion)
            {
                if (!AbrirConexion())
                {
                    return null;
                }

                try {
                    SqlCommand command = new SqlCommand(nombreComando, sqlConnection);
                    command.CommandType = CommandType.StoredProcedure;

                    foreach (SqlParameter parameter in parametros)
                    command.Parameters.Add(parameter);

                    return command.ExecuteReader();
                }
                catch {return null;}
            }
            else
            {
                return null;
            }
        }
            
        
       
    }
}
